package Planificador.test;

import org.junit.Before;
import org.junit.Test;

import Planificador.core.dispositivos.DispositivoExterno;
import Planificador.core.dispositivos.Procesador;
import Planificador.core.exceptions.ConsumioTodaLaRafagaCpuException;
import Planificador.core.exceptions.ConsumioTodaLaRafagaEntradaSalidaException;
import Planificador.core.exceptions.FinDeProcesoException;
import Planificador.core.proceso.InstruccionPedidoEntradaSalida;
import Planificador.core.proceso.InstruccionUsoCpu;
import Planificador.core.proceso.Proceso;

public class testDispositivos {

	DispositivoExterno disco;
	DispositivoExterno impresora;

	@Before
	public void fixture() {
		disco = new DispositivoExterno();
		impresora = new DispositivoExterno();
	}

	@Test(expected = FinDeProcesoException.class)
	public void testProcesadorFinDeProceso() throws FinDeProcesoException,
			ConsumioTodaLaRafagaCpuException,
			ConsumioTodaLaRafagaEntradaSalidaException {
		Proceso p1 = new Proceso("p1");
		Procesador procesador = new Procesador();

		p1.addInstruccion(new InstruccionUsoCpu(4, procesador));
		procesador.agregarProceso(p1);

		procesador.recibirQuantum();
		procesador.recibirQuantum();
		procesador.recibirQuantum();
		procesador.recibirQuantum();
		procesador.recibirQuantum();

	}

	@Test(expected=Planificador.core.exceptions.ConsumioTodaLaRafagaCpuException.class)
	public void testProcesadorFinDeProceso2() throws FinDeProcesoException,
			ConsumioTodaLaRafagaCpuException,
			ConsumioTodaLaRafagaEntradaSalidaException {
		Proceso p1 = new Proceso("p1");
		Procesador procesador = new Procesador();

		DispositivoExterno disco = new DispositivoExterno("disco");

		p1.addInstruccion(new InstruccionUsoCpu(1, procesador));
		p1.addInstruccion(new InstruccionPedidoEntradaSalida(1, disco));
		p1.addInstruccion(new InstruccionUsoCpu(1, procesador));
		procesador.agregarProceso(p1);
		p1.inicializar();
		procesador.recibirQuantum();
		procesador.recibirQuantum();

	}

	@Test(expected = ConsumioTodaLaRafagaCpuException.class)
	public void testProcesadorConsumioTodaLaRafagaCpu()
			throws FinDeProcesoException, ConsumioTodaLaRafagaCpuException,
			ConsumioTodaLaRafagaEntradaSalidaException {
		Proceso p1 = new Proceso("p1");
		Procesador procesador = new Procesador();

		p1.addInstruccion(new InstruccionUsoCpu(1, procesador));
		p1.addInstruccion(new InstruccionPedidoEntradaSalida(4, this.disco));

		p1.inicializar();
		
		procesador.agregarProceso(p1);
		
		
		procesador.recibirQuantum();		
		procesador.recibirQuantum();
		procesador.recibirQuantum();

	}

	@Test(expected = ConsumioTodaLaRafagaEntradaSalidaException.class)
	public void testProcesadorConsumioTodaLaRafagaEntradaSalida()
			throws ConsumioTodaLaRafagaCpuException, FinDeProcesoException,
			ConsumioTodaLaRafagaEntradaSalidaException {
		Proceso p1 = new Proceso("p1");
		Procesador procesador = new Procesador();

		p1.addInstruccion(new InstruccionPedidoEntradaSalida(2, this.disco));
		p1.addInstruccion(new InstruccionUsoCpu(2, procesador));

		this.disco.agregarProceso(p1);

		p1.inicializar();
		
		this.disco.recibirQuantum();
		this.disco.recibirQuantum();

	}

}
